def solution(rawStr, encodedStr):
    # Please write your code here
    # 定义定义了 Base32 的索引 - 字符转换表，每个索引对应一个 ASCII 字符。
    base32_table = "9876543210mnbvcxzasdfghjklpoiuyt"

    # 接收参数
    rawstr = rawStr
    encodedstr = encodedStr

    # 定义编码函数
    def base32_encode(rawStr):
        # 初始化一个空字符串，用于存储输入数据转换为二进制后的结果。
        binary_data = ""

        for char in rawStr:
            # 将每个字符转换为 ASCII 码值，再转换为二进制表示，并去掉 bin 函数返回结果的前缀 0b，然后使用 zfill(8) 确保每个二进制字符长度为 8 位。
            binary_char = bin(ord(char))[2:].zfill(8)
            # 将每个字符的二进制表示添加到 binary_data 字符串中。
            binary_data += binary_char
        # 计算二进制数据长度对 5 取余的结果，以确定需要补多少个零才能使二进制数据长度是 5 的倍数。
        remainder = len(binary_data) % 5

        # 如果余数不为 0，则在 binary_data 末尾补充相应数量的零。
        if remainder:
            binary_data += "0" * (5 - remainder)

        # 初始化一个空字符串，用于存储编码后的结果。
        encoded = ""

        # 以 5 位为一组遍历二进制数据。
        for i in range(0, len(binary_data), 5):
            # 每次取出 5 位的二进制数据块。
            chunk = binary_data[i:i + 5]
            # 将二进制数据块转换为十进制索引。
            index = int(chunk, 2)
            # 根据索引在转换表中找到对应的字符，并添加到 encoded 字符串中。
            encoded += base32_table[index]
        # 计算需要添加的填充字符数量。根据原始二进制数据长度除以 40 的余数来确定填充数量。
        padding = (len(binary_data) % 40)

        # 如果需要填充，则在编码结果末尾添加相应数量的 +，使得编码结果的长度是 8 的倍数；如果不需要填充，则直接返回编码结果。
        if padding:
            return encoded + "+" * (8 - len(encoded) % 8)
        else:
            return encoded

    # 定义解码函数
    def base32_decode(encodedStr):
        # 初始化一个空字符串，用于存储解码过程中的二进制数据。
        binary_data = ""

        # 遍历输入的 Base32 编码字符串中的每个字符。
        for char in encodedStr:
            # 检查字符是否在转换表中。
            if char in base32_table:
                # 如果字符在转换表中，找到其在转换表中的索引。
                index = base32_table.index(char)
                # 将索引转换为二进制表示，并确保长度为 5 位。
                binary_char = bin(index)[2:].zfill(5)
                # 将二进制字符添加到 binary_data 字符串中。
                binary_data += binary_char

        # 计算输入字符串中 + 的数量，以确定在编码时添加的填充数量。
        padding_count = encodedStr.count('+')

        if padding_count == 6:
            binary_data = binary_data[:(40 * 6 // 5)]
        elif padding_count == 4:
            binary_data = binary_data[:(40 * 4 // 5)]
        elif padding_count == 3:
            binary_data = binary_data[:(40 * 3 // 5)]
        elif padding_count == 1:
            binary_data = binary_data[:(40 * 1 // 5)]

        # 初始化一个空字符串，用于存储解码后的结果。
        decoded = ""

        # 以 8 位为一组遍历二进制数据。
        for i in range(0, len(binary_data), 8):
            # 每次取出 8 位的二进制数据块。
            chunk = binary_data[i:i + 8]
            # 将二进制数据块转换为十进制数。
            decimal = int(chunk, 2)
            # 将十进制数转换为 ASCII 字符，并添加到 decoded 字符串中。
            decoded += chr(decimal)
        return decoded

    encode_result = base32_encode(rawstr)
    decode_result = base32_decode(encodedstr)

    result = encode_result + ":" + decode_result
    return result

if __name__ == "__main__":
    #  You can add more test cases here
    print(solution("foo", "b0zj5+++") == "bljhy+++:bar")
    print(solution(
        "The encoding process represents 40-bit groups of input bits as output strings of 8 encoded characters.  Proceeding from left to right, a 40-bit input group is formed by concatenating 5 8bit input groups. These 40 bits are then treated as 8 concatenated 5-bit groups, each of which is translated into a single character in the base 32 alphabet.  When a bit stream is encoded via the base 32 encoding, the bit stream must be presumed to be ordered with the most-significant- bit first. That is, the first bit in the stream will be the high- order bit in the first 8bit byte, the eighth bit will be the low- order bit in the first 8bit byte, and so on.",
        "bljhy+++b0zj5+++") == "maf3m164vlahyl60vlds9i6svuahmiod58l3mi6sbglhmodfcbz61b8vb0fj1162c0jjmi6d58jhb160vlk2mu89b0fj1il9b4ls9oogcak2mu89cvp25pncbuls9oo359i79lncbvjh1ln558ahzknsb4aj1lnscbj7917zc0jh3ln4bafhill9bll3yo09vashbu89cajs9id0buf21n89b5z61b8vb0fj1160vlk2mu89bul3yunz58fj3163vul3pln558a2s166vuj33knfbgj37u60vlds9v0928a3su89v4j29unf58dj5oogc8lsi17fv8sj3l093zk79kd0cals9knsbfz21p64vkz21id4b4p3ml89b4ls9c89bvjhiko8cashiknfbgs79v0vb0fj1162c0jjmi6d4zz3mkn6v9z3yla9cuf3sko158fj316fc0zhiiobb4p3ml89v4j21ol9b5z23pncbuh3m166v8zj5kn6casj5160vkz21p6458a37io459ld5168vak3zkn7bgp7i189muf3moa9b5z35pnf58lj1id4b4hs9pnd58shikoxbash116hv4zs9u61bfz35kndbfz63ba9bgj33oo5v4j3cn89caf3m167v4p79iofc0sh7o09vgpj3u89b0ss9i6sbgljmon4bzz21ol9b0ss9oosbasj5ln558ohsu6158p3zl09vgjj3u8vcvfhcod0blfh3kncczhs9kd0czz3bpnscvp7i17fv8zj1160cbh79u61bfz3bpnscvp79kd0czz3soa9caf3m16dcal3mknv58ohso6b58a3m16fv8ss9p60buf7p16xc0s3mia9b0fj1160vkz21p6458d3siddczz6zkd0czz35ynfbfh79u61bfz3mpn2v8p3z167v4p79uo0vah79kd458p3zl09vajjcn09vul31lns58a3su89v4j79u61bfz3bpnscvp79c67v4p79kdlcassk168vls79iox58jhinz+:foobar")
